package com.exthirteen.textgamescript.config;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.io.Serializable;

/**
 * <p>
 * 枚举字典接口
 * 枚举ID值是作为数据库表中存储的值，它可以是Integer与String两种类型
 *
 * 使用方式： 实现本接口 , 定义ID的泛型Integer或String
 *
 * 底层支持自动将枚举注册到全局字典中（用于前端获取当前服务所有字典）
 * </p>
 *
 * @author exthirteen
 * @since 2021-11-20
 */
@JsonDeserialize(using = BaseEnumDeserializer.class)
@JsonSerialize(using = BaseEnumSerializer.class)
public interface IEnum<T extends Serializable> {

    /**
     * 获取字典code
     * @return
     */
    T getId();

    /**
     * 获取字典详细描述
     * @return
     */
    String getValue();

    /**
     * 根据类型与枚举ID值获取
     * @param enumId 枚举ID
     * @param clazz 枚举类型
     * @param <E> IEnum
     */
    static <E extends Enum<?> & IEnum<?>> E idOf(Serializable enumId, Class<E> clazz) {
        E[] enumConstants = clazz.getEnumConstants();
        for (E enumConstant : enumConstants) {
            if (String.valueOf(enumId).equals(String.valueOf(enumConstant.getId()))) {
                return enumConstant;
            }
        }
        return null;
    }
}
